package com.kefu.repository;

import com.kefu.entity.Session;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

public interface SessionRepository extends JpaRepository<Session, String> {
    // 根据用户ID查询会话
    List<Session> findByUserIdOrderByLastMessageTimeDesc(String userId);

    // 根据客服ID查询会话
    List<Session> findByAdminIdOrderByLastMessageTimeDesc(String adminId);


    /**
     * 查询所有有未读消息的会话（无论是否分配客服）
     * 按最后消息时间倒序排列，确保最新的未读消息优先展示
     */
    @Query("SELECT s FROM Session s WHERE s.unreadCount > 0 ORDER BY s.lastMessageTime DESC")
    List<Session> findAllWithUnreadMessages();

    /**
     * 查询未分配客服且有未读消息的会话
     * 按最后消息时间升序排列，确保最早的未处理消息优先分配
     */
    @Query("SELECT s FROM Session s WHERE s.adminId IS NULL AND s.unreadCount > 0 ORDER BY s.lastMessageTime ASC")
    List<Session> findUnassignedWithUnreadMessages();

    /**
     * 将会话绑定到指定客服
     * 同时重置未读计数并更新会话状态为进行中
     */
    @Transactional
    @Modifying
    @Query("UPDATE Session s SET " +
            "s.adminId = :adminId, " +
            "s.unreadCount = 0, " +
            "s.status = 1 " +  // 1表示会话进行中
            "WHERE s.id = :sessionId")
    int bindSessionToAdmin(
            @Param("sessionId") String sessionId,
            @Param("adminId") String adminId
    );

    /**
     * 更新会话的未读消息计数和最后消息信息
     * 当用户发送新消息时调用
     */
    @Transactional
    @Modifying
    @Query("UPDATE Session s SET " +
            "s.unreadCount = s.unreadCount + 1, " +
            "s.lastMessage = :lastMessage, " +
            "s.lastMessageTime = :lastMessageTime " +
            "WHERE s.id = :sessionId")
    int incrementUnreadCount(
            @Param("sessionId") String sessionId,
            @Param("lastMessage") String lastMessage,
            @Param("lastMessageTime") Date lastMessageTime
    );

    /**
     * 根据会话ID和客服ID查询会话
     * 用于权限验证
     */
    @Query("SELECT s FROM Session s WHERE s.id = :sessionId AND s.adminId = :adminId")
    Session findByIdAndAdminId(
            @Param("sessionId") String sessionId,
            @Param("adminId") String adminId
    );

    /**
     * 查询未分配客服（adminId 为 null）且未读消息数大于 0 的会话
     * @param unreadCount 未读消息数阈值（传入 0 即可查询所有未读消息数 > 0 的会话）
     * @return 符合条件的会话列表
     */
    List<Session> findByAdminIdIsNullAndUnreadCountGreaterThan(int unreadCount);

}

